package com.hb.A_基础.B_高阶函数和lambda

/**
 * 在E_匿名函数.kt的filterCountries函数中的匿名函数，会发现：
 *  1. fun(country:Country)显得比较啰嗦，因为编译器会推导类型，所以只需要一个代表变量的country就行了
 *  2. return 关键字也可以省略，这里返回的是一个有值的表达式
 *  3. 模仿函数类型的语法，我们可以用- >把参数和返回值连接在一起
 */
fun main() {
//    val list = listOf<Country>(Country("梅州", "梅州", 100000), Country("DONG", "B", 100))
//    //简化后的表达式
//    /**
//     * 这个就是lambda表达式，它与匿名函数一样，是一种函数字面量。
//     * 总结lambda的语法：
//     *  1. 一个lambda表达式必须通过{}来包裹
//     *  2. 如果lambda声明了参数部分的类型，且返回值支持类型推导，那么lambda变量就可以省略函数类型声明
//     *  3. 如果lambda变量声明了函数类型，那么lambda的参数部分的类型就可以省略
//     *
//     *  注意：如果lambda表达式返回的不是Unit,那么默认最后一行表达式的值类型就是返回值类型
//     */
//    filterCountries(list,{country->country.continent == "梅州" && country.population >1000}).forEach(::println)
//
//    //默认返回值是最后一行
//    val foo={
//        x:Int->
//        val y=x+1
//        y
//    }
//    println(foo(1))
//
//    fun bar(int:Int) {
//        println(int)
//    }
//    listOf(1,2,3).forEach{
//        bar(it)
//    }
//    listOf(1,2,3).forEach(::println)


    println("单个参数的隐式名称")
    /**
     * 单个参数的隐式名称
     */
    fun foo2(int: Int) {
        println(int)
    }

    fun foo3(int: Int) = {
        println(int)
    }

    listOf(1, 2, 3).forEach {
        foo2(it)
        foo3(it)()
    }
    println("-------")




}